package cn.wjzhang.core.utils;

import javax.servlet.http.HttpServletRequest;

/**
 * ========================
 * 获取客户端ip
 *
 * @author wjzhang
 * @version v1.0
 * ========================
 * @date 2023/6/20 11:26
 */
public class IPUtils {

    private static final String[] IP_HEADER_NAMES = {
            "X-Forwarded-For",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_X_CLUSTER_CLIENT_IP",
            "HTTP_CLIENT_IP",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "REMOTE_ADDR"
    };

    /**
     * 获取客户端真实 IP 地址
     * @param request HttpServletRequest 对象
     * @return 客户端真实 IP 地址
     */
    public static String getClientIp(HttpServletRequest request) {
        for (String header : IP_HEADER_NAMES) {
            String ip = request.getHeader(header);
            if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
                return getFirstValidIp(ip);
            }
        }
        return request.getRemoteAddr();
    }

    /**
     * 从 IP 地址列表中获取第一个有效的 IP 地址
     * @param ipList 逗号分隔的 IP 地址列表
     * @return 第一个有效的 IP 地址，如果列表为空，则返回空字符串
     */
    private static String getFirstValidIp(String ipList) {
        String[] ips = ipList.split(",");
        for (String ip : ips) {
            ip = ip.trim();
            if (isValidIp(ip)) {
                return ip;
            }
        }
        return "";
    }

    /**
     * 验证 IP 地址的有效性
     * @param ip IP 地址
     * @return true 表示有效，false 表示无效
     */
    private static boolean isValidIp(String ip) {
        // 这里可以根据具体需求编写 IP 地址的验证逻辑
        // 例如，可以使用正则表达式进行验证
        // 这里简单地假设任何非空的 IP 地址都是有效的
        return ip != null && !ip.isEmpty();
    }
}
